package com.oa.common.utils;

import java.util.Arrays;

/**
 * 字符、进制转化
 * 
 * @author Administrator
 *
 */
public class HexadecimalConversionUtil {
	/*
	 * 字节转10进制
	 * 直接使用(int)类型转换。
	 */
	public static int byte2Int(byte b) {
		int r = (int) b;
		return r;
	}

	/*
	 * 10进制转字节
	 * 直接使用(byte)类型转换。
	 */
	public static byte int2Byte(int i) {
		byte r = (byte) i;
		return r;
	}

	/*
	 * 字节数组转16进制字符串
	 * 对每一个字节，先和0xFF做与运算，然后使用Integer.toHexString()函数，如果结果只有1位，需要在前面加0。
	 */
	public static String bytes2HexString(byte[] b) {
		String r = "";
		for (int i = 0; i < b.length; i++) {
			String hex = Integer.toHexString(b[i] & 0xFF);
			if (hex.length() == 1) {
				hex = '0' + hex;
			}
			r += hex.toUpperCase();
		}
		return r;
	}

	/*
	 * 字符转换为字节
	 */
	private static byte charToByte(char c) {
		return (byte) "0123456789ABCDEF".indexOf(c);
	}

	/*
	 * 16进制字符串转字节数组
	 * 每一个16进制字符是4bit，一个字节是8bit，所以两个16进制字符转换成1个字节，
	 * 对于第1个字符，转换成byte以后左移4位，然后和第2个字符的byte做或运算，这样就把两个字符转换为1个字节。
	 */
	public static byte[] hexString2Bytes(String hex) {
		if ((hex == null) || (hex.equals(""))) {
			return null;
		} else if (hex.length() % 2 != 0) {
			return null;
		} else {
			hex = hex.toUpperCase();
			int len = hex.length() / 2;
			byte[] b = new byte[len];
			char[] hc = hex.toCharArray();
			for (int i = 0; i < len; i++) {
				int p = 2 * i;
				b[i] = (byte) (charToByte(hc[p]) << 4 | charToByte(hc[p + 1]));
			}
			return b;
		}
	}

	/*
	 * 字节数组转字符串
	 * 直接使用new String()
	 */
	public static String bytes2String(byte[] b) throws Exception {
		String r = new String(b, "UTF-8");
		return r;
	}

	/*
	 * 字符串转字节数组
	 * 直接使用getBytes()
	 */
	public static byte[] string2Bytes(String s) {
		byte[] r = s.getBytes();
		return r;
	}

	/*
	 * 16进制字符串转字符串
	 * 先转换成byte[]，再转换成字符串
	 */
	public static String hex2String(String hex) throws Exception {
		String r = bytes2String(hexString2Bytes(hex));
		return r;
	}

	/*
	 * 字符串转16进制字符串
	 * 先转换为byte[]，再转换为16进制字符串
	 */
	public static String string2HexString(String s) throws Exception {
		String r = bytes2HexString(string2Bytes(s));
		return r;
	}

	/*public static void main(String[] args) throws Exception {
		byte b1 = (byte) 45;
		System.out.println("1.字节转10进制:" + byte2Int(b1));

		int i = 89;
		System.out.println("2.10进制转字节:" + int2Byte(i));

		byte[] b2 = new byte[] { (byte) 0xFF, (byte) 0x5F, (byte) 0x6,
				(byte) 0x5A };
		System.out.println("3.字节数组转16进制字符串:" + bytes2HexString(b2));

		String s1 = new String("FF");
		System.out.println("4.16进制字符串转字节数组:"
				+ Arrays.toString(hexString2Bytes(s1)));

		System.out.println("5.字节数组转字符串:" + bytes2String(b2));

		System.out.println("6.字符串转字节数组:" + Arrays.toString(string2Bytes(s1)));
		
		System.out.println("7.16进制字符串转字符串:" + hex2String(s1));

		String s2 = new String("171");
		System.out.println("8.字符串转16进制字符串:" + string2HexString(s2));
		System.out.println("9.十进制转化为16进制："+Integer.toHexString(171).toUpperCase()); 
		*//*long dec_num = Long.parseLong("FF", 16);
        System.out.println((byte) dec_num);  
        System.out.println((byte) Integer.parseInt("01"));*//*
        System.out.println("10.16进制转化为十进制："+Long.parseLong("AB", 16));  
	}*/
	
	
	/**
	 * 单个字节转换成十六进制字符串
	 */
	private static final char[] hexCode = "0123456789ABCDEF".toCharArray();  
	public static String printHexBinary(byte b) {  
        StringBuilder r = new StringBuilder(2 * 2);  
        r.append(hexCode[(b >> 4) & 0xF]);
        r.append(hexCode[(b & 0xF)]);  
        System.out.println("r="+r);
        return r.toString();  
    }  
	
}
